// 
//  Author:
//    Anton Lauridsen anton at lauridsen decimal-separator info
// 
//  Copyright (c) 2009, Anton Lauridsen
// 
//  All rights reserved.
// 
//  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
// 
//     * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in
//       the documentation and/or other materials provided with the distribution.
//     * Neither the name of the [ORGANIZATION] nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
// 
//  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
//  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
//  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
//  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
//  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
//  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
//  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
//  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
//  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
//  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
//  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// 

using System;
using System.Collections.Generic;
using NHibernate;
using NHibernate.Criterion;

namespace OpenFuse.Cache.Repositories
{
	
	[Serializable]
	public class GridRepository : MarshalByRefObject, Comms.IGridList
	{
        public Comms.IGrid GetByNick(string nick)
        {
            using (ISession session = LocalCache.OpenSession())
            {
                return session.CreateCriteria(typeof(Comms.IGrid))
                    .Add(Restrictions.Eq("Nick", nick))
                    .UniqueResult<Comms.IGrid>();
            }
        }

        public IList<Comms.IGrid> GetAll()
        {
			try 
			{
	            using (ISession session = LocalCache.OpenSession())
    	        {
        	        return session.CreateCriteria(typeof(Grid)).List<Comms.IGrid>();
            	}
			} catch(Exception ex)
			{
				//TODO: Log a critical error
				Console.WriteLine(ex);
			}
			return null;
		}
		
		// an active grid, is a grid which has accounts that are marked as active
		public IList<Comms.IGrid> GetActiveGrids()
		{
            using (ISession session = LocalCache.OpenSession())
            {
				DetachedCriteria d = DetachedCriteria.For(typeof(Comms.IAccount))
    				.SetProjection(Projections.RowCount())
    				.Add(Property.ForName("Grid").EqProperty("Root.RowId"));

				return session.CreateCriteria(typeof(Comms.IGrid), "Root")
					.Add(Subqueries.Lt(0, d))
                    .List<Comms.IGrid>();
            }
		}
		
		public Comms.IGrid NewGrid()
		{
			return new Grid();
		}
		
        public void Save(Comms.IGrid g)
        {
			try
			{
	            using (ISession session = LocalCache.OpenSession())
	                using (ITransaction transaction = session.BeginTransaction())
	                {
	                    session.SaveOrUpdate(g);
	                    transaction.Commit();
	                }
			} catch(Exception ex) {
				//TODO:: Log a critical error
				Console.WriteLine(ex);
			}
        }

        public void Delete(Comms.IGrid g)
        {
            using (ISession session = LocalCache.OpenSession())
                using (ITransaction transaction = session.BeginTransaction())
                {
                    session.Delete(g);
                    transaction.Commit();
                }
        }
	}
}
